package net.ankao.org.easylock.annotation;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 分布式锁注解
 * </p>
 *
 * @author ankao.net
 * @since 2022/3/28
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface EasyLock {

    /**
     * 锁的名称。（支持 SpEL 表达式）
     *
     * @return 锁名
     */
    String value() default "";



    /**
     * 是否使用公平锁。公平锁即先来先得
     * @return 是否使用公平锁。
     */
    boolean fairLock() default false;


    /**
     * 是否使用尝试锁
     * @return 是否使用尝试锁
     */
    boolean tryLock() default true;


    /**
     * 最长等待时间，该字段只有当tryLock()返回true才有效。
     * @return 最长等待时间
     */
    long waitTime() default 0L;


    /**
     * 超时时间过后，锁自动释放。 可以为-1
     * @return 锁超时时间
     */
    long leaseTime() default 5L;


    /**
     * 时间单位。默认为秒。
     * @return 时间单位
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;


    /**
     * 分布式锁占用时异常描述
     * @return 分布式锁占用时异常描述
     */
    String exceptionDesc() default "分布式锁被占用，获取超时！";


    /**
     * 拥有条件/限制条件，只有为 true 才执行加锁逻辑。（支持 SpEL 表达式）
     * @return 是否加锁
     */
    String condition() default "true";
}
